// #include <stdio.h>
//
// int main()
// {
//     // int a = 1;
//     // int b =1;
//     // int c = 2;
//     //
//     // //取地址符
//     // printf("%p\n",&a);
//     // printf("%p\n",&b);
//     // printf("%p\n",&c);
//     //
//     // //怎么获取变量的地址
//     // //1.普通变量地址 &变量名
//     // //2. 一维数组首地址： 数组名或&数组名[0]
//     // //3. 函数地址 函数名或者&函数名
//     //
//     //
//     // //定义指针 类型* 标识符
//     //
//     // int* p1;
//     // char* p2;
//     // double* p3;
//     //
//     // //指针变量 存的地址 64位 8字节 32位 4字节
//     // printf("%d\t%d\t%d\t",sizeof(p1),sizeof(p2),sizeof(p3));
//     //
//     // int arr[3] = {1,2,3};
//     // printf("array:%zd\n",sizeof(arr));
//     // printf("array:%p\t",arr);
//     // printf("array:%p\t",&arr[0]);
//     //
//     // //指针变量的几个常见状态
//     // //1. 未初始化 int* p1;上面这种  未初始化的指针  野指针
//     // //2, 指向空的指针NULL 0强制转换成(void*)0 不可改变的内存
//     // p1=NULL;
//     // p2=NULL;
//     // p3=NULL;
//     //
//     //
//     // int* pp=NULL;
//     // printf("%p\n",pp);
//     //
//     // //常见运算
//     // //取值运算 解引用运算 *
//     // int num = 0;
//     // int* pnum=&num;
//     // *pnum=666;
//     // printf("%d\n%d\n%d\n",num,*pnum,pnum[0]);
//     //
//     // //p+n 或者p-n 用偏移的方式
//     // //指针类型  int* p
//     // //指针所指向的类型: int--> 操作的数据的类型 去掉变量名 *号
//     //
//     // printf("p1=%p\n",p1); //int
//     // printf("p2=%p\n",p2); //char
//     // printf("p3=%p\n",p3); //double
//     //
//     // //指针类型操作有关 + m  m*类型的数据位
//     // printf("p1=%p\n",p1+1); //int
//     // printf("p2=%p\n",p2+1); //char
//     // printf("p3=%p\n",p3+1); //double
//     //
//     // //根据类型来的
//     // printf("array=%p\n",arr);
//     // printf("array=%p\n",arr+1);
//
//
//     int(*p)[3]=NULL; //偏移12个字节 //指针数组
//     printf("p=%p\n",p); //int[3] 是一个数组 偏移就偏移一个数组  12
//     printf("p=%p\n",p+1); // 偏移就偏移一个数组  12
//
//     //int(*p)[3];,这个定义说明p是指向3个int型元素的指针变量,也就是相当于指向3列的二维数组,p指向第0行的3个元素,p+1指向第1行的3个元素,以此类推。[ ]
//
//     int a[3]={1,2,3};
//     int(*t)[3]=&a;
//     printf("%d\n",*t[0]);
//
//     //const和指针变量
//     //以下两种没区别
//     const  int  cnum1=100;
//     int const cnum2 = 100;
//
//
//     //指针变量 内存对应的数据的类型 //修饰的指针所指向的内容
//     //const 描述指针所指向的内容
//     const int* p1=&cnum1;
//     int const* p2=&cnum1;
//
//     int data = 0;
//     p1 =  &data;
//     printf("%d\n",*p1);
//
//     //指针变量的指向是不可能被修改的
//     int* const p3 = &data;
//     //错误的 不能被修改的 const 修饰的是p3不能被修改
//     // p3=p2;
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//     return 0;
// }